home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / 2336B.ZIP / SCRDISK4.EXE / arc / VALIDATE.C < prev    next >
Text File  |  1990-04-11  |  14KB  |  666 lines

  1. /* Turbo ScrEdit Validate Procedures */
  2.  
  3. void S_Find_Min_and_Max()
  4. {
  5. int C1, C2, s_len;
  6.  
  7. S_CompMin[0]=0;
  8. S_CompMax[0]=0;
  9. C1 = 0;
  10. C2 = 0;
  11.  
  12. s_len=strlen(S_CurStr);
  13.  
  14. S_Min_Max_Loaded = 0;
  15. S_EndofLine    = 0;
  16.  
  17. while (!S_Min_Max_Loaded)
  18.   {
  19.   S_Sub++;
  20.   if  (S_Sub<s_len)
  21.     {
  22.     if  (S_CurStr[S_Sub]==94)
  23.       {
  24.       S_Sub++;
  25.       S_CompMax[C2++]=S_CurStr[S_Sub];
  26.       }
  27.     else
  28.       {
  29.       if  (S_CurStr[S_Sub]==39)
  30.         {
  31.         if  (S_CompMax[0]==0) strcpy(S_CompMax,S_CompMin);
  32.         S_Min_Max_Loaded = 1;
  33.         }
  34.       else
  35.         {
  36.         if  (S_CompMax[0]==0)
  37.           {
  38.           S_CompMin[C1++]=S_CurStr[S_Sub];
  39.           S_CompMin[C1]=0;
  40.           }
  41.         else
  42.           {
  43.           S_CompMax[C2++]=S_CurStr[S_Sub];
  44.           S_CompMax[C2]=0;
  45.           }
  46.         }
  47.       }
  48.     if  ((S_CompMin[0]==92)||(S_CompMin[0]==61)) S_Min_Max_Loaded = 1;
  49.     }
  50.   else
  51.     {
  52.     S_Min_Max_Loaded=1;
  53.     S_EndofLine   =1;
  54.     }
  55.   }
  56. if  (S_UpCase)
  57.   {
  58.   strcpy(S_CompMin,strupr(S_CompMin));
  59.   strcpy(S_CompMax,strupr(S_CompMax));
  60.   }
  61. }
  62.  
  63.  
  64.  
  65.  
  66. void S_ReadNextRangeRec()
  67. {
  68. long rec;
  69.  
  70. S_CurrLine = S_NextLine;
  71.  
  72. if  (S_VRec != S_NextRec)
  73.   {
  74.   rec = (S_NextRec)*sizeof(*s_indx);
  75.   fseek(s_file,rec,0);
  76.   fread(s_indx,sizeof(*s_indx),1,s_file);
  77.   S_VRec = S_NextRec;
  78.   }
  79.  
  80. S_NextRec   = s_indx->D.s_rangerec [S_CurrLine];
  81. S_NextLine  = s_indx->D.s_rangeline[S_CurrLine]-1;
  82. movmem(&s_indx->D.s_rangelist[S_CurrLine][1],&S_CurStr,
  83.        s_indx->D.s_rangelist[S_CurrLine][0]);
  84. S_CurStr[s_indx->D.s_rangelist[S_CurrLine][0]]=0;
  85. S_Sub = (S_InsideIf) ? 4:1;
  86. S_CompMin[0]=0;
  87. S_CompMax[0]=0;
  88. }
  89.  
  90.  
  91.  
  92.  
  93. void S_ProcessDate()
  94. {
  95. char
  96.  DateMask[40],
  97.  TestMonth[3],
  98.  TestDay[3],
  99.  TestYear[5],
  100.  CheckMonth,
  101.  CheckDay,
  102.  CheckYear;
  103. int
  104.  x,y,z,
  105.  WorkMonth,
  106.  WorkDay,
  107.  WorkYear,
  108.  WorkNum;
  109.  
  110. CheckMonth   = 0;
  111. CheckDay     = 0;
  112. CheckYear    = 0;
  113. WorkMonth    = 0;
  114. WorkDay      = 0;
  115. WorkYear     = 0;
  116. S_ErrorMsg[0]     = 0;
  117. x = (S_InsideIf) ? 8:5;
  118. z = x;
  119. y = 0;
  120.  
  121. while (S_CurStr[x]!=0)
  122.   {
  123.   switch (S_CurStr[x])
  124.     {
  125.     case 'D':
  126.       {
  127.       if  (!isdigit(S_EditStr[y]))
  128.         {
  129.         strcpy(S_ErrorMsg,"Day contains a invalid character for <");
  130.         strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
  131.         strcat(S_ErrorMsg,"> Format");
  132.         goto Exit_Point;
  133.         }
  134.       CheckDay++;
  135.       TestDay[CheckDay-1]=S_EditStr[y];
  136.       TestDay[CheckDay]  =0;
  137.       break;
  138.       }
  139.     case 'M':
  140.       {
  141.       if  (!isdigit(S_EditStr[y]))
  142.         {
  143.         strcpy(S_ErrorMsg,"Month contains a invalid character for <");
  144.         strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
  145.         strcat(S_ErrorMsg,"> Format");
  146.         goto Exit_Point;
  147.         }
  148.       CheckMonth++;
  149.       TestMonth[CheckMonth-1]=S_EditStr[y];
  150.       TestMonth[CheckMonth]  =0;
  151.       break;
  152.       }
  153.    case 'Y':
  154.       {
  155.       if  (!isdigit(S_EditStr[y]))
  156.         {
  157.         strcpy(S_ErrorMsg,"Year contains a invalid character for <");
  158.         strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
  159.         strcat(S_ErrorMsg,"> Format");
  160.         goto Exit_Point;
  161.         }
  162.       CheckYear++;
  163.       TestYear[CheckYear-1]=S_EditStr[y];
  164.       TestYear[CheckYear]  =0;
  165.       break;
  166.       }
  167.    default :
  168.       {
  169.       if  (S_EditStr[y]!=S_CurStr[x])
  170.         {
  171.         strcpy(S_ErrorMsg,"Please enter date in <");
  172.         strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
  173.         strcat(S_ErrorMsg,"> Format");
  174.         goto Exit_Point;
  175.         }
  176.       }
  177.     }
  178.   y++;
  179.   x++;
  180.   }
  181.  
  182. if  (S_EditStr[y]!=0)
  183.   {
  184.   strcpy(S_ErrorMsg,"You have keyed to many charactes for <");
  185.   strcat(S_ErrorMsg,(char *)&S_CurStr[z]);
  186.   strcat(S_ErrorMsg,"> Format");
  187.   goto Exit_Point;
  188.   }
  189.  
  190. WorkDay   = (CheckDay  >0) ? atoi(TestDay)  :0;
  191. WorkMonth = (CheckMonth>0) ? atoi(TestMonth):0;
  192. WorkYear  = (CheckYear >0) ? atoi(TestYear) :0;
  193. WorkNum   = (WorkYear/4);
  194. WorkNum  *= 4;
  195. WorkNum  -= WorkYear;
  196.  
  197. if  ((CheckMonth>0)&&((WorkMonth < 1)||(WorkMonth>12)))
  198.   {
  199.   strcpy(S_ErrorMsg,"You have keyed a invalid Month. Use 1 thru 12 only");
  200.   goto Exit_Point;
  201.   }
  202.  
  203. if  (CheckDay>0)
  204.   {
  205.   if  ((WorkMonth==4)||(WorkMonth==6)||(WorkMonth==9)||(WorkMonth==11))
  206.     {
  207.     if  (WorkDay>30)
  208.       {
  209.       strcpy(S_ErrorMsg,"This month can have only 30 days or less");
  210.       goto Exit_Point;
  211.       }
  212.     }
  213.   else
  214.     {
  215.     if  ((WorkMonth!=2)&&(WorkDay>31))
  216.       {
  217.       strcpy(S_ErrorMsg,"This month can have only 31 days or less");
  218.       goto Exit_Point;
  219.       }
  220.     else
  221.       {
  222.       if  (WorkMonth == 2)
  223.         {
  224.         if  (WorkNum==0)
  225.           {
  226.           if  (WorkDay>29)
  227.             {
  228.             strcpy(S_ErrorMsg,"February can have only 29 days or less");
  229.             goto Exit_Point;
  230.             }
  231.           }
  232.         else
  233.           {
  234.           if  (WorkDay>28)
  235.             {
  236.             strcpy(S_ErrorMsg,"February can have only 28 days or less");
  237.             goto Exit_Point;
  238.             }
  239.           }
  240.         }
  241.       }
  242.     }
  243.   }
  244.  
  245. if  ((CheckYear>0)&&(WorkYear<1))
  246.   {
  247.   strcpy(S_ErrorMsg,"Year must have a value greater than zero.");
  248.   goto Exit_Point;
  249.   }
  250.  
  251. Exit_Point:
  252.  
  253. if  (S_ErrorMsg[0]!=0)
  254.   {
  255.   S_ScreenValid       = 0;
  256.   S_Validate_Finished = 1;
  257.   S_Skip              = 1;
  258.   }
  259. }
  260.  
  261.  
  262.  
  263. void S_ProcessIn()
  264. {
  265. int x,y,z;
  266.  
  267. S_GetFieldType(s_field->C.s_type[S_Point]);
  268. S_Decimal = S_FType;
  269.  
  270. S_Matched    = 0;
  271. S_CompMin[0] = 0;
  272.  
  273. if  (!S_Matched)
  274.   {
  275.   while ((!S_Matched)&&(S_CompMin[0]!=92)&&(S_CompMin[0]!='='))
  276.     {
  277.     S_Find_Min_and_Max();
  278.     if  ((S_CompMin[0]!=92)&&(S_CompMin[0]!='=')&&(!S_EndofLine))
  279.       {
  280.       if  (S_Decimal < 8)
  281.         {
  282.         S_Numeric       = atof(S_EditStr);
  283.         S_CompMin_Numeric = atof(S_CompMin);
  284.         S_CompMax_Numeric = atof(S_CompMax);
  285.         if ((S_Numeric>=S_CompMin_Numeric)&&(S_Numeric<=S_CompMax_Numeric))
  286.           S_Matched = 1;
  287.         }
  288.       else
  289.         {
  290.         if ((strcmp(S_EditStr,S_CompMin)>=0) &&
  291.             (strcmp(S_EditStr,S_CompMax)<=0))
  292.           S_Matched = 1;
  293.         }
  294.       }
  295.     if  ((S_EndofLine) && ((S_CompMin[0]==0) && (S_CompMax[0]==0)))
  296.       {
  297.       S_ReadNextRangeRec();
  298.       while ((S_CurStr[S_Sub]!=39)&&
  299.              (S_CurStr[S_Sub]!=92)&&
  300.              (S_CurStr[S_Sub++]!='='));
  301.       if  ((S_CurStr[S_Sub]==92)||(S_CurStr[S_Sub]=='='))
  302.         {
  303.         S_CompMin[0]=S_CurStr[S_Sub];
  304.         S_CompMin[1]=0;
  305.         }
  306.       }
  307.     }
  308.   }
  309.  
  310. if  (S_Matched)
  311.   {
  312.   while ((S_CurStr[S_Sub]!=92)&&(S_CurStr[S_Sub]!='='))
  313.     {
  314.     S_Sub=0;
  315.     while ((S_CurStr[S_Sub]!=0)&&
  316.            (S_CurStr[S_Sub]!=92)&&
  317.            (S_CurStr[S_Sub]!='=')) S_Sub++;
  318.     if  ((S_CurStr[S_Sub]!=92)&&(S_CurStr[S_Sub]!='='))
  319.       {
  320.       S_ReadNextRangeRec();
  321.       S_Sub=0;
  322.       }
  323.     }
  324.   if  (S_CurStr[S_Sub]=='=')
  325.     {
  326.     S_ScreenValid       = 0;
  327.     S_Validate_Finished = 1;
  328.     x                   = strlen(S_CurStr);
  329.     s_copy(S_CurStr,S_ErrorMsg,S_Sub+1,x-S_Sub);
  330.     }
  331.   else
  332.     {
  333.     S_OpCode[0]=0;
  334.     S_Matched = 0;
  335.     }
  336.   }
  337. else
  338.   {
  339.   if  (S_CurStr[S_Sub]==92)
  340.     {
  341.     S_ScreenValid       = 0;
  342.     S_Validate_Finished = 1;
  343.     x                   = strlen(S_CurStr);
  344.     s_copy(S_CurStr,S_ErrorMsg,S_Sub+1,x-S_Sub);
  345.     }
  346.   else
  347.     S_OpCode[0]=0;
  348.   }
  349. }
  350.  
  351.  
  352.  
  353. void S_Processif()
  354. {
  355. int c,x,y,z;
  356. S_Matched = 0;
  357. S_CompMin[0]=0;
  358. S_CompMax[0]=0;
  359. S_EndofLine =0;
  360.  
  361. while (strcmp(S_CompMin,"THEN")!=0)
  362.   {
  363.   if  (S_EndofLine)
  364.     {
  365.     S_ReadNextRangeRec();
  366.     S_Sub=0;
  367.     while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
  368.     }
  369.  
  370.   if  (S_CurStr[3]=='N')
  371.     {
  372.     x = 7;
  373.     S_OpCode1[0]='N';
  374.     }
  375.   else
  376.     {
  377.     x = 3;
  378.     S_OpCode1[0]=0;
  379.     }
  380.  
  381.   y=0;
  382.   while (x>0)
  383.     {
  384.     if   ((S_CurStr[x]!=39)&&(S_CurStr[x]!=32)) S_CompField[y++]=S_CurStr[x++];
  385.     else x=0;
  386.     S_CompField[y]=0;
  387.     }
  388.  
  389.   strupr(S_CompField);
  390.  
  391.   S_FieldNum = 0;
  392.   x        = 1;
  393.   while (x)
  394.     {
  395.     if  (S_FieldNum == s_curr.s_count)
  396.       {
  397.       S_FieldNum = -1;
  398.       x        = 0;
  399.       }
  400.     else
  401.       if  (strcmp(S_CompField,strupr(s_field->C.s_fieldname[S_FieldNum]))==0)
  402.         x=0;
  403.       else
  404.         S_FieldNum++;
  405.     }
  406.  
  407.   S_CompMin[0]=0;
  408.   S_CompMax[0]=0;
  409.  
  410.   if   (S_FieldNum > -1) S_Get_Field_Value(S_FieldNum);
  411.   else strcpy(S_CompMin,"THEN");
  412.  
  413.   if  (S_UpCase) strupr(S_EditStr);
  414.  
  415.   S_GetFieldType(s_field->C.s_type[S_FieldNum]);
  416.   S_Decimal = S_FType;
  417.  
  418.   S_EndofLine = 0;
  419.   while ((strcmp(S_CompMin,"AND")!=0)&&
  420.          (strcmp(S_CompMin,"OR")!=0)&&
  421.          (strcmp(S_CompMin,"THEN")!=0))
  422.     {
  423.     if  (S_EndofLine)
  424.       {
  425.       S_ReadNextRangeRec();
  426.       S_Sub=0;
  427.       while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
  428.       }
  429.     S_Find_Min_and_Max();
  430.     if ((strcmp(S_CompMin,"AND")!=0)&&
  431.         (strcmp(S_CompMin,"OR")!=0) &&
  432.         (strcmp(S_CompMin,"THEN")!=0))
  433.       {
  434.       if  (S_Decimal<7)
  435.         {
  436.         S_Numeric         = atof(S_EditStr);
  437.         S_CompMin_Numeric = atof(S_CompMin);
  438.         S_CompMax_Numeric = atof(S_CompMax);
  439.         if  (S_OpCode1[0]=='N')
  440.           {
  441.           if ((S_Numeric<S_CompMin_Numeric)||(S_Numeric>S_CompMax_Numeric))
  442.             S_Matched = 1;
  443.           }
  444.         else
  445.           {
  446.           if ((S_Numeric>=S_CompMin_Numeric)&&(S_Numeric<=S_CompMax_Numeric))
  447.             S_Matched = 1;
  448.           }
  449.         }
  450.       else
  451.         {
  452.         if  (S_OpCode1[0]=='N')
  453.           {
  454.           if ((strcmp(S_EditStr,S_CompMin)<0)||(strcmp(S_EditStr,S_CompMax)>0))
  455.             S_Matched = 1;
  456.           }
  457.         else
  458.           if ((strcmp(S_EditStr,S_CompMin)>=0)&&
  459.               (strcmp(S_EditStr,S_CompMax)<=0))
  460.             S_Matched = 1;
  461.         }
  462.       }
  463.     }
  464.   if  (strcmp(S_CompMin,"AND")==0)
  465.     {
  466.     if  (!S_Matched)
  467.       {
  468.       S_CompMin[0]=0;
  469.       while ((strcmp(S_CompMin,"OR")!=0)&&(strcmp(S_CompMin,"THEN")!=0))
  470.         {
  471.         S_ReadNextRangeRec();
  472.         S_Sub=0;
  473.         while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
  474.         S_CompMin[0]=0;
  475.         while ((strcmp(S_CompMin,"AND")!=0)
  476.              &&(strcmp(S_CompMin,"OR")!=0)
  477.              &&(strcmp(S_CompMin,"THEN")!=0))
  478.              S_Find_Min_and_Max();
  479.         }
  480.       if  (strcmp(S_CompMin,"OR")==0) S_CompMin[0]=0;
  481.       }
  482.     else
  483.       {
  484.       S_CompMin[0] = 0;
  485.       S_Matched    = 0;
  486.       }
  487.     }
  488.   else
  489.     {
  490.     if  (strcmp(S_CompMin,"OR")==0)
  491.       {
  492.       if  (S_Matched)
  493.         {
  494.         while (strcmp(S_CompMin,"THEN")!=0)
  495.           {
  496.           S_ReadNextRangeRec();
  497.           S_Sub=0;
  498.           while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
  499.           while ((strcmp(S_CompMin,"AND")!=0)
  500.                  &&(strcmp(S_CompMin,"OR")!=0)
  501.                  &&(strcmp(S_CompMin,"THEN")!=0))
  502.             S_Find_Min_and_Max();
  503.           }
  504.         }
  505.       else
  506.         S_CompMin[0]=0;
  507.       }
  508.     }
  509.   }
  510.  
  511.  
  512. strcpy(S_EditStr,S_EditStrHold);
  513.  
  514. if  (S_Matched)
  515.   {
  516.   S_Matched  = 0;
  517.   S_InsideIf = 1;
  518.   while ((S_ScreenValid)&&(S_CurStr[0]!='E')&&(!S_Skip))
  519.     {
  520.     S_ReadNextRangeRec();
  521.     if  (S_CurStr[0]!='E')
  522.       {
  523.       switch (S_CurStr[3])
  524.         {
  525.         case 'D' : {S_ProcessDate();break;}
  526.         case 'I' :
  527.           {
  528.           S_Sub=0;
  529.           while ((S_CurStr[S_Sub]!=0)&& (S_CurStr[S_Sub]!=39)) S_Sub++;
  530.           S_ProcessIn();
  531.           break;
  532.           }
  533.         case 'S' : {S_Skip = 1;break;}
  534.         case 'E' :
  535.           {
  536.           S_ScreenValid = 0;
  537.           strcpy(S_ErrorMsg,&S_CurStr[9]);
  538.           }
  539.         }
  540.       }
  541.     }
  542.   S_InsideIf = 0;
  543.   }
  544. while (strcmp(S_CurStr,"ENDIF")!=0) S_ReadNextRangeRec();
  545. }
  546.  
  547.  
  548.  
  549.  
  550. void S_Validate_Location()
  551. {
  552. int x,y,z;
  553. S_UpCase= 0;
  554. S_InsideIf= 0;
  555. S_Matched= 0;
  556. S_Skip= 0;
  557. S_OpCode[0]= 0;
  558. S_CurrLine= 9999;
  559.  
  560. while ((S_NextRec)&&(!S_Skip))
  561.   {
  562.   S_ReadNextRangeRec();
  563.   if  (S_CurStr[0] == 'I') /* check for IN or if */
  564.     {
  565.     S_Sub = s_pos(S_CurStr,"'");
  566.     if   (S_CurStr[1] == 'F') S_Processif();
  567.     else S_ProcessIn();
  568.     if  (S_Validate_Finished) S_NextRec = 0;
  569.     }
  570.   if  (S_CurStr[0] == 'U') /* check for Upshift key word */
  571.     {
  572.     if  (S_CurStr[10] == 'N') /* if ON */
  573.       {
  574.       S_UpCase = 1;
  575.       strupr(S_EditStr);
  576.       }
  577.     else
  578.       {
  579.       S_UpCase = 0;      /* if Off */
  580.       strcpy(S_EditStr,S_NewStr);
  581.       }
  582.     strcpy(S_EditStrHold,S_EditStr);
  583.     }
  584.   if  ((S_CurStr[0] == 'R')||((S_CurStr[0] == 'S')&&(S_CurStr[1] == 'K')))
  585.     {
  586.     x = strlen(S_EditStr);
  587.     while ((x>0)&&(S_EditStr[x-1]<33))
  588.       {
  589.       S_EditStr[x-1]=0;
  590.       x++;
  591.       }
  592.     if  (S_EditStr[0]==0)
  593.       {
  594.       if  (S_CurStr[0]=='S') S_NextRec = 0;
  595.       if  (S_CurStr[0]=='R')
  596.         {
  597.         S_Sub = 0;
  598.         while ((S_CurStr[S_Sub]!=0)&&(S_CurStr[S_Sub]!=39)) S_Sub++;
  599.         if  (S_CurStr[S_Sub]==39)
  600.           strcpy(S_ErrorMsg,(char *)&S_CurStr[S_Sub]);
  601.         else
  602.           strcpy(S_ErrorMsg,"** This field is required **");
  603.         S_ScreenValid = 0;
  604.         S_NextRec = 0;
  605.         }
  606.       }
  607.     }
  608.   if  (S_CurStr[0]=='D') S_ProcessDate();
  609.   }
  610. }
  611.  
  612.  
  613.  
  614.  
  615. void S_ValidateScreen()
  616. {
  617. int C;
  618. S_PrevField   = S_Point;
  619. if (s_curr.s_rangerecno==0)
  620.   {
  621.   S_Validate_Finished = 1;
  622.   S_ScreenValid       = 1;
  623.   }
  624. else
  625.   {
  626.   S_Point             = -1;
  627.   S_UpCase            = 0;
  628.   S_Validate_Finished = 0;
  629.   if  (S_ValidateField > -1) S_Point = S_ValidateField;
  630.   }
  631. while (!S_Validate_Finished)
  632.   {
  633.   if  (S_Point < s_curr.s_count)
  634.     {
  635.     S_NextRec  = s_field->C.s_rangenextrec [S_Point];
  636.     S_NextLine = s_field->C.s_rangenextline[S_Point]-1;
  637.     if  (S_NextRec)
  638.       {
  639.       S_ScreenValid = 1;
  640.       S_Get_Field_Value(S_Point);
  641.       strcpy(S_EditStrHold,S_EditStr);
  642.       strcpy(S_NewStr,S_EditStr);
  643.       S_Validate_Location();
  644.       if  ((!S_ScreenValid)||(S_ValidateField > -1))
  645.         {
  646.         S_Validate_Finished = 1;
  647.         S_Point--;
  648.         }
  649.       }
  650.     S_Point++;
  651.     }
  652.   else
  653.     {
  654.     S_Validate_Finished = 1;
  655.     }
  656.   }
  657. if (S_ScreenValid)
  658.    S_Point = S_PrevField;
  659. else
  660.    if (S_IsDupe(S_Point)) S_SetDupeFields = 1;
  661. S_ValidateField = -1;
  662. }
  663.  
  664.  
  665.  
  666.